perm filename MAKEII.SAI[11,ALS] blob sn#049077 filedate 1973-06-14 generic text, type T, neo UTF8
00100	
00200	BEGIN "MAKE"
00300	
00400	DEFINE ⊂="COMMENT";
00500	REQUIRE "MACROS[1,THO]" SOURCE_FILE;
00600	REQUIRE "COMSUB.HDR[1,THO]" SOURCE_FILE;
00800	  REQUIRE "BLOCKS.HDR" SOURCE_FILE;
01000	INTERNAL INTEGER INTOT,M,N,P,INFLAG,HINT,PONY;
01100	INTEGER I,J,J1,K,L,Q,PHPNT,PH2PNT,HPOINT,IMAX,LMID,LMAX,CHAN1,CHAN2,CHAN3,CHAN4,EOF;
01200	INTERNAL INTEGER ARRAY DATBUF[0:1024];
01300	STRING READ1,READ2,READ3,READ4,READ5;
01400	INTERNAL INTEGER I1L,I1H,I2L,I2H,I3L,I3H,  INL,INH,NZRNG,  FP1L,FP1H,FP2L,FP2H,
01500	            ILPB,ILPC,  IHPB,IHPC ;
01600	INTERNAL INTEGER NF; ⊂ *** USED IN PREPARE;
01800	LABEL LABEL1,START,O1;
01900	
02000	PRELOAD_WITH 
02100	'410313000000,
02200	'360313000000,
02300	'330313000000,
02400	'300313000000,
02500	'250313000000,
02600	'220313000000,
02700	'170313000000,
02800	'140313000000,
02900	'110313000000,
03000	'060313000000,
03100	'030313000000,
03200	'000313000000;
03300	INTEGER ARRAY LBYTE2[0:11];	⊂ These byte pointers are used (by MAC) with the
03400					starting address of the array being referenced
03500					in index register '13 and the relative location
03600					added into the address field;
03700	PRELOAD_WITH 
03800	'420213000000,
03900	'370213000000,
04000	'340213000000,
04100	'310213000000,
04200	'260213000000,
04300	'230213000000,
04400	'200213000000,
04500	'150213000000,
04600	'120213000000,
04700	'070213000000,
04800	'040213000000,
04900	'010213000000;
05000	INTEGER ARRAY LBYTE3[0:11];
05100	PRELOAD_WITH 
05200	'430113000000,
05300	'400113000000,
05400	'350113000000,
05500	'320113000000,
05600	'270113000000,
05700	'240113000000,  
05800	'210113000000,
05900	'160113000000,
06000	'130113000000,
06100	'100113000000,
06200	'050113000000,
06300	'020113000000;
06400	INTEGER ARRAY LBYTE6[0:11];
06500	DEFINE TB="'11",STRIN="STRINGIN";
06600	
06700	
     

00100	BEGIN   ⊂ GENERATE TABLES;
00200	
00300	CHAN1←1;  CHAN2←2; CHAN3←3; CHAN4←4;
00400	       TABIN(INTOT);  ⊂ INPUT TABLES;
00600	START:	
00700	OUTSTR(CRLF&"This routine is used to generate SIGNATURE TABLES."&CRLF);
00800	OUTSTR("It will ask a number of questions which must be answered by"&CRLF
00900	&" typing the required information followed by a CR."&CRLF);
05800	
05900	OUTSTR(CRLF&"The following input procedures are available"&CRLF);
06000	 I←0;
06100	  FOR P←0 STEP 1 UNTIL INSIZ DO
06200	  BEGIN
06300	   IF INNAM[P]≠0 THEN OUTSTR(CVXSTR(INNAM[P])&TB) ELSE DONE;
06400	   I←I+1; IF I≥8 THEN BEGIN I←0; OUTSTR(CRLF); END;
06500	  END;
06600	OUTSTR(CRLF&LF);
06700	 END;
06800	
06900	IF (STRIN("DO YOU WANT INPUT TABLES RESET TO ZER0 (YorCR) = "))="Y" THEN 
07000	    FOR P←0 STEP 1 UNTIL INTOT-1 DO BEGIN
07100	    INCNT[P]←0;
07200	    I←P*74+10;
07250	    TABLES[I-7]←0;
07300	    FOR J←I STEP 1 UNTIL I+63 DO TABLES[J]←0; END;
07400	
08400	OUTSTR("Available SIGNIFICANT FEATURES are"&CRLF);
08500	J←0; FOR I←0 STEP 1 UNTIL 35 DO BEGIN
08600	 IF FLIST[I]=0 THEN DONE;
08700	 OUTSTR(CVXSTR(FLIST[I])&TB); J←J+1;
08800	 IF J≥8 THEN BEGIN OUTSTR(CRLF); J←0; END;
08900	END; OUTSTR(CRLF);
09000	IF I=0 THEN OUTSTR(TB&TB&"NONE"&CRLF);
10500	
10600	OUTSTR("PH list and H list table contains"&CRLF);
10700	OUTSTR(CRLF&"PH"&TB&"Significant features"&CRLF);
10800	FOR I←0 STEP 1 UNTIL 63 DO BEGIN
10900	 IF PHLIST[I]=0 THEN DONE;
11000	 OUTSTR(CVXSTR(PHLIST[I])&TB);
11100	HPOINT←POINT(1,HLIST[I],-1);
11200	 FOR J←0 STEP 1 UNTIL 35 DO
11300	   IF (K←ILDB(HPOINT))=1 THEN OUTSTR(CVXSTR(FLIST[J])&" ");
11400	 OUTSTR(CRLF);
11500	END;
11600	
11700	OUTSTR("Enter corrections or additions. Type PH symbol followed by features. "&CRLF);
11800	OUTSTR("After each CR you will be prompted as to what is expected next."&CRLF);
11900	K←0;
12000	 WHILE J≥0 DO BEGIN
12100	   IF (READ1←STRIN("PH symbol = ")) ="" THEN DONE;
12200	   K←K+1;
12300	   FOR I←0 STEP 1 UNTIL 63 DO BEGIN
12400	     IF PHLIST[I]=0 THEN PHLIST[I]←CVSIX(READ1);
12500	     IF CVSIX(READ1)=PHLIST[I] THEN DONE;
12600	    END;
12700	    HLIST[I]←0;
12800	    WHILE J≥0 DO BEGIN
12900	     WHILE J≥0 DO BEGIN
13000	       IF (READ2←STRIN("F="))="" THEN DONE;
13100	       HPOINT←POINT(1,HLIST[I],-1);
13200	       FOR J←0 STEP 1 UNTIL 35 DO BEGIN
13300	         IBP(HPOINT);
13400	         IF FLIST[J]=0 THEN BEGIN FLIST[J]←CVSIX(READ2);
13500	            OUTSTR(READ2&" added to feature list"&CRLF); END;
13600	         IF CVSIX(READ2)=FLIST[J] THEN DONE;
13700	        END;
13800	       IF J≥36 THEN OUTSTR("NOT FOUND"&CRLF) ELSE DONE;
13900	      END;
14000	     IF READ2 ="" THEN DONE;
14100	     DPB(1,HPOINT);
14200	    END;
14300	    CLRBUF;
14400	   END;
14500	OUTSTR(CRLF);
14600	IF K≠0 THEN BEGIN
14700	OUTSTR("PH list and H list table now contains"&CRLF);
14800	OUTSTR(CRLF&"PH"&TB&"Significant features"&CRLF);
14900	FOR I←0 STEP 1 UNTIL 63 DO BEGIN
15000	 IF PHLIST[I]=0 THEN DONE;
15100	 OUTSTR(CVXSTR(PHLIST[I])&TB);
15200	HPOINT←POINT(1,HLIST[I],-1);
15300	 FOR J←0 STEP 1 UNTIL 35 DO
15400	   IF (K←ILDB(HPOINT))=1 THEN OUTSTR(CVXSTR(FLIST[J])&" ");
15500	 OUTSTR(CRLF);
15600	END;
15700	OUTSTR(CRLF);
15800	 END;
     

00010	⊂ THIS PAGE IS ADDED TO INCLUDE SELECTIVELY ADJUSTING INPUT TABLES;
00020	
00030	INFLAG←0; ⊂ THIS IS SET TO 1 WHEN A NEW INPUT TABLE IS ADDED, USE IT LATER
00040				TO ZERO REMAINING TABLES;
00050	
00060	OUTSTR(CRLF&"Following INPUT tables exist");
00070	J←63; L←0;
00080	WHILE TRUE DO
00090	BEGIN "INPUTS"
00100	  IF J≠0 THEN BEGIN
00110	    OUTSTR(CRLF&"Name"&TB&"Input"&TB); SETFORMAT(1,0);
00120	    FOR I←0 STEP 1 UNTIL 7 DO OUTSTR("Feat"&CVS(I)&TB);
00130	    FOR L←0 STEP 1 UNTIL INTOT-1 DO BEGIN 
00135	
00140	    OUTSTR(CRLF&CVXSTR(LIST[L])&TB&CVXSTR(INNAM[(TABLES[L*74+4] LAND '777)]));
00150	    I←POINT(1,TABLES[L*74+5],-1);
00160	    FOR J←0 STEP 1 UNTIL 35 DO IF (ILDB(I))=1 THEN
00170		OUTSTR(TB&CVXSTR(FLIST[J]));  END; 
00180	
00190	
00200	IF (STRIN("Do you want to change the name of a input table "))="Y" THEN
00210	  WHILE TRUE DO BEGIN
00220		OUTSTR(CRLF&"Old name = "); READ1←INCHWL;
00230		IF READ1="" THEN DONE ELSE
00240		   FOR L←0 STEP 1 UNTIL INTOT-1 DO IF LIST[L]=CVSIX(READ1) THEN DONE;
00250	           IF L<INTOT THEN  BEGIN OUTSTR(CRLF&"New name = ");
00260					LIST[L]←CVSIX(INCHWL); END ELSE
00270				OUTSTR(CRLF&READ1&"   not found"); END; ⊂ WHILE TRUE;
00280	      END;  ⊂ ENDS IF J≠0 PRINTING;
00290	OUTSTR(CRLF&"Now typein the name of input table to be added or changed"&
00300	CRLF&"(WARNING:: adding a new input table destroyes the following) = ");
00310	   READ1←INCHWL;  IF READ1="" THEN DONE;
00320	   FOR L←0 STEP 1 UNTIL INTOT-1 DO IF LIST[L]=CVSIX(READ1) THEN DONE;
00330	   IF L≥INTOT THEN BEGIN LIST[INTOT]←CVSIX(READ1);
00340				 LIST[INTOT+1]←0; ⊂ ALL FURTHER TABLES ARE DESTROYED;
00350		OUTSTR(CRLF&"New INTOT = "&CVS(INTOT+1)); INFLAG←1;
00360		          INTOT←INTOT+1;  
00370	
00380		L←INTOT-1; ⊂ SET PROPER L TO ADD FEATURES ETC;
00390					END;
00400	  I←-1; WHILE I=-1 DO BEGIN  OUTSTR(CRLF&"Type the name of input parameter = ");
00410	   READ2←INCHWL; FOR I←0 STEP 1 UNTIL INSIZ DO 
00420			   IF CVSIX(READ2)=INNAM[I] THEN DONE ELSE
00430			   IF INNAM[I]=0 THEN BEGIN OUTSTR(CRLF&"not found"); I←-1;
00440				DONE END; END; ⊂ END WHILE I=-1;
00450	    TABLES[L*74+4]←'000607000000+I; ⊂ CREATES A POINTER TO PROPER INDAT;
00455	   TABLES[L*74+1]←0;  ⊂ To insure classed as an I table
00460	
00470	        K←0; ⊂ STORES THE LEARNING INFO;
00480	  WHILE TRUE DO BEGIN OUTSTR(CRLF&"Give the feature to learn on = ");
00490	   READ2←INCHWL; IF READ2="" THEN DONE;
00500		FOR I←0 STEP 1 UNTIL 35 DO IF FLIST[I]=CVSIX(READ2) THEN DONE ELSE
00510			IF FLIST[I]=0 THEN BEGIN OUTSTR(CRLF&"not found");
00520	        		      DONE END;
00530		IF I≠-1 THEN K←K+(1 LSH (35-I)); END; ⊂ ENDS WHILE LOOP;
00540	       TABLES[L*74+5]←K; ⊂ PLANTS THE LEARNING PATTERN;
00550	
00560	IF STRIN("Want a listing ")="Y" THEN J←1 ELSE J←0;
00570	
00580	END "INPUTS";
00590	
00600	
     

16000	IF (STRIN("Do you want to start fresh from here on YorCR = "))="Y" THEN
16100	 BEGIN
16200	  FOR I←INTOT STEP 1 UNTIL LISSIZ-1 DO LIST[I]←0;
16300	  FOR I←INTOT*74 STEP 1 UNTIL TABSIZ-1 DO TABLES[I]←0;
16400	 END;
16500	J←63; L←INTOT;		⊂ Temporary use as flags;
16600	
16700	 OUTSTR(CRLF&"The following tables exist"&CRLF);
16800	WHILE L<LISSIZ%10-1 DO
16900	BEGIN
17000	 IF J≠0 THEN BEGIN
17100	OUTSTR(CRLF&"Name"&TB&"TYPE"&TB&"Learn"&TB&"Gate1"&TB&"Gate2"&TB&"Gate3"&TB&"Gate4"&TB&"IN1"&TB&"IN2"&TB&"IN3"&CRLF);
17200	FOR L←INTOT STEP 1 UNTIL LISSIZ%10-2 DO 
17300	  IF LIST[L]≠0 THEN IF LIST[L]≠1 THEN BEGIN "DECODE" STRING LEARN;INTEGER K1,K2,K3,K4;
17400	    IF LIST[L+LISSIZ%10]≥CVSIX("Q0") THEN BEGIN
17500	       K←LIST[L+LISSIZ%5]; K1←K LSH -18; K2←(K LSH 18) LSH -30;
17600	       K3←(K LSH 24) LSH -30; K4←(K LSH 30) LSH -30;
17700	       LEARN←CVXSTR(PHLIST[K1])[1 TO 2]&CVXSTR(PHLIST[K2])[1 TO 2]&
17800	             CVXSTR(PHLIST[K3])[1 TO 2]&CVXSTR(PHLIST[K4])[1 TO 2];
17900						  END 
18000	          ELSE LEARN←CVXSTR(LIST[L+LISSIZ%5]);
18100	  OUTSTR(CVXSTR(LIST[L])&TB&CVXSTR(LIST[L+LISSIZ%10])&
18200	LEARN);
18210	    Q←POINT(1,LIST[L+3*LISSIZ%10],-1); K←1;
18220	    FOR J←0 STEP 1 UNTIL 35 DO IF (ILDB(Q))=1 THEN BEGIN K←K+1;
18230		OUTSTR(TB&CVXSTR(FLIST[J])); END; 
18240	FOR Q←K STEP 1 UNTIL 4 DO OUTSTR(TB);
18250	OUTSTR(TB&CVXSTR(LIST[L+4*LISSIZ%10])&TB&
18400	CVXSTR(LIST[L+LISSIZ%2])&TB&CVXSTR(LIST[L+6*LISSIZ%10])&TB&CRLF); END "DECODE";
18700	LMAX←L;
18800	END;
18900	OUTSTR(CRLF); IF L=0 THEN OUTSTR(TB&TB&"NONE"&CRLF);
19000	CLRBUF;
19100	
19200	OUTSTR(CRLF&"Now type the name of a table to be modified or added."&CRLF&
19300	            "(WARNING Do NOT change type P to Q or Viceversa)"&CRLF);
19400	IF (READ1←STRIN("A CR. only, terminates the session. Name= "))="" THEN DONE;
19500	FOR L←INTOT STEP 1 UNTIL LISSIZ%10-1 DO BEGIN
19600	  IF LIST[L]=0 THEN  LIST[L]←CVSIX(READ1);
19700	  IF CVSIX(READ1)=LIST[L] THEN DONE;
19800	 END;
19900	 IF L≥LISSIZ%10 THEN BEGIN OUTSTR("TOO MANY TABLES****"&CRLF); DONE; END;
20000	I←L*74; 
20100	WHILE ¬EQU(READ1,"Q") DO IF ¬EQU(READ1,"P") THEN
20200	 READ1←(STRIN("Specify table type P or Q = ")) ELSE DONE;
20300	P←CVD( STRIN("Number of inputs (2 3 or 6) = "));
20400	LIST[L+LISSIZ%10]←CVSIX(READ1&CVS(P));
20500	TABLES[I+1]←(P LSH 24);
20600	IF READ1="Q" THEN BEGIN
20700	   LIST[L+1]←1;  ⊂ EXTRA SPACE FOR Q TABLES;
20800	 TABLES[I+1]←TABLES[I+1]+(1 LSH 30);		⊂ 1 IF Q OTHERWISE 0;
20900	 TABLES[I+75]←(2 LSH 30);         ⊂  2 DENOTES Q EXTENSION;
21000	 OUTSTR("Four PH symbols needed"&CRLF);
21100	 WHILE J≥0 DO BEGIN
21200	  READ2←STRIN("First PH = ");
21300	  FOR J←0 STEP 1 UNTIL 63 DO IF CVSIX(READ2)=PHLIST[J] THEN DONE;
21400	  IF J≥64 THEN OUTSTR("NOT FOUND, TRY AGAIN****"&CRLF) ELSE DONE;
21500	 END;
21600	 TABLES[I+2]←(J LSH 18);	⊂ Four ph values saved in learn for Q tables;
21700	
21800	 WHILE J≥0 DO BEGIN
21900	  READ3←STRIN("Second PH= ");
22000	  FOR J←0 STEP 1 UNTIL 63 DO IF CVSIX(READ3)=PHLIST[J] THEN DONE;
22100	  IF J≥64 THEN OUTSTR("NOT FOUND, TRY AGAIN****"&CRLF) ELSE DONE;
22200	 END;
22300	 TABLES[I+2]←TABLES[I+2]+(J LSH 12);
22400	 WHILE J≥0 DO BEGIN
22500	  READ4←STRIN("Third PH= ");
22600	  FOR J←0 STEP 1 UNTIL 63 DO IF CVSIX(READ4)=PHLIST[J] THEN DONE;
22700	  IF J≥64 THEN OUTSTR("NOT FOUND, TRY AGAIN****"&CRLF) ELSE DONE;
22800	 END;
22900	 TABLES[I+2]←TABLES[I+2]+(J LSH 6);
23000	 WHILE J≥0 DO BEGIN
23100	  READ5←STRIN("Fourth PH= ");
23200	  FOR J←0 STEP 1 UNTIL 63 DO IF CVSIX(READ5)=PHLIST[J] THEN DONE;
23300	  IF J≥64 THEN OUTSTR("NOT FOUND, TRY AGAIN****"&CRLF) ELSE DONE;
23400	 END;
23500	 TABLES[I+2]←TABLES[I+2]+J;
23600	⊂ PHPNT←POINT(6,K,11); ⊂ PH2PNT←POINT(12,K,11);
23700	⊂ K←CVSIX(READ2);
23800	⊂ IF LDB(PHPNT)=0 THEN READ2←READ2&" ";
23900	⊂ K←CVSIX(READ3);
24000	⊂ IF LDB(PHPNT)=0 THEN READ3←READ3&" ";
24100	⊂ K←CVSIX(READ4);
24200	⊂ IF LDB(PHPNT)=0 THEN READ4←READ4&" ";
24300	
24400	⊂  LIST[L+2*LISSIZ%10]←CVSIX(READ2&READ3&READ4);
24500	  LIST[L+LISSIZ%5]←TABLES[I+2];
24600	END ELSE BEGIN
24700	 WHILE J≥0 DO BEGIN
24800	 READ2←STRIN("One  SIGNIFICANT FEATURE needed = ");
24900	 FOR J←0 STEP 1 UNTIL 35 DO IF CVSIX(READ2)= FLIST[J] THEN DONE;
25000	 IF J≥36 THEN OUTSTR("NOT FOUND. TRY AGAIN****"&CRLF) ELSE DONE;
25100	 END;
25200	LIST[L+2*LISSIZ%10]←CVSIX(READ2);
25300	 TABLES[I+2]←((35-J) LSH 30) + '000113000002; 
25400	    ⊂ Creates a pointer word which points to the J-th bit in the word PONY;
25500	END;
25600	J←LMAX;
     

00010	  WHILE TRUE DO BEGIN  OUTSTR(CRLF&"Tables are now gated during learning on features");
00015	        J←0; ⊂ STORES THE LEARNING INFO;
00020	  WHILE TRUE DO BEGIN OUTSTR(CRLF&"Give a feature to gate on = ");
00030	   READ2←INCHWL; IF READ2="" THEN DONE;
00040		FOR Q←0 STEP 1 UNTIL 35 DO IF FLIST[Q]=CVSIX(READ2) THEN DONE ELSE
00050			IF FLIST[Q]=0 THEN BEGIN OUTSTR(CRLF&"not found"); Q←-1;
00060	        		      DONE END;
00070		IF Q≠-1 THEN J←J+(1 LSH (35-Q)); END; ⊂ ENDS WHILE LOOP;
00080	       LIST[L+3*LISSIZ%10]←TABLES[I+3]←J; ⊂ PLANTS THE LEARNING PATTERN;
00090	
00100	IF STRIN("Want a listing of features")="Y" THEN BEGIN
00200	    Q←POINT(1,TABLES[I+3],-1);
00210	    FOR J←0 STEP 1 UNTIL 35 DO IF (ILDB(Q))=1 THEN
00220		OUTSTR(TB&CVXSTR(FLIST[J]));
00320	         IF STRIN("WANT TO REDO THESE ")≠"Y" THEN DONE; END ELSE DONE END; 
00420	J←0;
00520	
25700	
27600	LABEL1:	WHILE J≥0 DO
27700	BEGIN
27800	  READ2←STRIN("Name of table for the first input.   IN1= ");
27900	  FOR J←0 STEP 1 UNTIL LMAX DO    IF LIST[J]=CVSIX(READ2) THEN DONE;
28000	  IF J>LMAX THEN OUTSTR("Name not found"&CRLF) ELSE DONE;
28100	END;
28200	K←CVD(STRIN("     Type recency of datum to be used   = ")); J1←J;
28300	IF J≥INTOT THEN IF LIST[J+LISSIZ%10]≥CVSIX("Q0") THEN
28400	  BEGIN  IF K>1 THEN BEGIN J1←J1+1; K←K-2 END;
28500	  K←CVD(STRIN("Which PH (0,1,2,3,4 or 5 for max) = "))+6*K; END;
28600	IF K>11 THEN K←11; IF K<0 THEN K←0;
28700	LIST[L+4*LISSIZ%10]←CVSIX(CVS(K)&READ2);
28800	IF P=2 THEN TABLES[I+4]←LBYTE2[K]+J1*74;	⊂ Store byte pointer in IN1;
28900	IF P=3 THEN TABLES[I+4]←LBYTE3[K]+J1*74;
29000	IF P=6 THEN TABLES[I+4]←LBYTE6[K]+J1*74;
29100	
29200	
29300	WHILE J≥0 DO
29400	BEGIN
29500	  READ2←STRIN("Type name of second input table.     IN2= ");
29600	  FOR J←0 STEP 1 UNTIL LMAX DO    IF CVSIX(READ2)=LIST[J] THEN DONE ;
29700	  IF J>LMAX THEN OUTSTR("Name not found"&CRLF) ELSE DONE;
29800	END;
29900	K←CVD(STRIN("     Type recency of datum to be used   = ")); J1←J;
30000	IF J≥INTOT THEN IF LIST[J+LISSIZ%10]≥CVSIX("Q0") THEN
30100	  BEGIN  IF K>1 THEN BEGIN J1←J1+1; K←K-2 END;
30200	  K←CVD(STRIN("Which PH (0,1,2,3,4 or 5 for max) = "))+6*K; END;
30300	IF K>11 THEN K←11; IF K<0 THEN K←0;
30400	LIST[L+5*LISSIZ%10]←CVSIX(CVS(K)&READ2);
30500	IF P=2 THEN TABLES[I+5]←LBYTE2[K]+J1*74;	⊂ Store byte pointer in IN2;
30600	IF P=3 THEN TABLES[I+5]←LBYTE3[K]+J1*74;
30700	IF P=6 THEN TABLES[I+5]←LBYTE6[K]+J1*74;
30800	
30900	IF P≥3 THEN BEGIN
31000	
31100	WHILE J≥0 DO
31200	BEGIN
31300	  READ2←STRIN("Type name of third input table.      IN3= ");
31400	  FOR J←0 STEP 1 UNTIL LMAX DO    IF LIST[J]=CVSIX(READ2) THEN DONE;
31500	  IF J>LMAX THEN OUTSTR("Name not found"&CRLF) ELSE DONE;
31600	END;
31700	K←CVD(STRIN("     Type recency of datum to be used   = ")); J1←J;
31800	IF J≥INTOT THEN IF LIST[J+LISSIZ%10]≥CVSIX("Q0") THEN
31900	  BEGIN  IF K>1 THEN BEGIN J1←J1+1; K←K-2 END;
32000	  K←CVD(STRIN("Which PH (0,1,2,3,4 or 5 for max) = "))+6*K; END;	
32100	IF K>11 THEN K←11; IF K<0 THEN K←0;
32200	LIST[L+6*LISSIZ%10]←CVSIX(CVS(K)&READ2);
32300	IF P=3 THEN TABLES[I+6]←LBYTE3[K]+J1*74;
32400	IF P=6 THEN TABLES[I+6]←LBYTE6[K]+J1*74;  ⊂ STORE BYTE POINTER IN IN3;
32500	END;	⊂ End of P≥3 section;
32600	
32700	IF P≥4 THEN BEGIN
32800	
32900	WHILE J≥0 DO
33000	BEGIN
33100	  READ2←STRIN("Name of table for the fourth input   IN4= ");
33200	  FOR J←0 STEP 1 UNTIL LMAX DO    IF LIST[J]=CVSIX(READ2) THEN DONE;
33300	  IF J>LMAX THEN OUTSTR("Name not found"&CRLF) ELSE DONE;
33400	END;
33500	K←CVD(STRIN("     Type recency of datum to be used   = ")); J1←J;
33600	IF J≥INTOT THEN IF LIST[J+LISSIZ%10]≥CVSIX("Q0") THEN
33700	  BEGIN  IF K>1 THEN BEGIN J1←J1+1; K←K-2 END;
33800	  K←CVD(STRIN("Which PH (0,1,2,3,4 or 5 for max) = "))+6*K; END;
33900	IF K>11 THEN K←11; IF K<0 THEN K←0;
34000	LIST[L+7*LISSIZ%10]←CVSIX(CVS(K)&READ2);
34100	TABLES[I+7]←LBYTE6[K]+J1*74;		⊂ Store byte pointer in IN4;
34200	
34300	
34400	WHILE J≥0 DO
34500	BEGIN
34600	  READ2←STRIN("Type name of fifth input table.     IN5= ");
34700	  FOR J←0 STEP 1 UNTIL LMAX DO    IF CVSIX(READ2)=LIST[J] THEN DONE ;
34800	  IF J>LMAX THEN OUTSTR("Name not found"&CRLF) ELSE DONE;
34900	END;
35000	K←CVD(STRIN("     Type recency of datum to be used   = ")); J1←J;
35100	IF J≥INTOT THEN IF LIST[J+LISSIZ%10]≥CVSIX("Q0") THEN
35200	  BEGIN  IF K>1 THEN BEGIN J1←J1+1; K←K-2 END;
35300	  K←CVD(STRIN("Which PH (0,1,2,3,4  or 5 for max) = "))+6*K;END;
35400	 IF K>11 THEN K←11; IF K<0 THEN K←0;
35500	LIST[L+8*LISSIZ%10]←CVSIX(CVS(K)&READ2);
35600	TABLES[I+8]←LBYTE6[K]+J1*74;		⊂ Store byte pointer in IN5;
35700	
35800	WHILE J≥0 DO
35900	BEGIN
36000	  READ2←STRIN("Type name of sixth input table.      IN6= ");
36100	  FOR J←0 STEP 1 UNTIL LMAX DO    IF LIST[J]=CVSIX(READ2) THEN DONE;
36200	  IF J>LMAX THEN OUTSTR("Name not found"&CRLF) ELSE DONE;
36300	END;
36400	K←CVD(STRIN("     Type recency of datum to be used   = ")); J1←J;
36500	IF J≥INTOT THEN IF LIST[J+LISSIZ%10]≥CVSIX("Q0") THEN
36600	  BEGIN  IF K>1 THEN BEGIN J1←J1+1; K←K-2 END;
36700	  K←CVD(STRIN("Which PH (0,1,2,3,4   or 5 for max) = "))+6*K; END;
36800	IF K>11 THEN K←11; IF K<0 THEN K←0;
36900	LIST[L+9*LISSIZ%10]←CVSIX(CVS(K)&READ2);
37000	TABLES[I+9]←LBYTE6[K]+J1*74;		⊂ Store byte pointer in IN6;
37100	
37200	END;	⊂ End of IF P≥4 THEN statement;
37300	IF STRIN("Want listing (Y or CR) = ")="Y" THEN J←6 ELSE J←0;
37400	END;	⊂ End of WHILE L≤63 DO statement (usually by DONE signal);
37500	
37600	IF STRIN("Should tables(excluding INPUT) be zeroed (Y or N) = ")="Y" THEN
37700	  FOR I←10+INTOT*74 STEP 74 UNTIL TABSIZ-64 DO
37800	    FOR J←I STEP 1 UNTIL I+63 DO TABLES[J]←0;
37900	
38000	IF (STRIN("Do you want to start fresh from here (counters) on Y or CR ="))="Y" THEN
38100	BEGIN FOR I←0 STEP 1 UNTIL TBLSIZ DO TABLET[I]←0; END;
38200	
38300	L←0; J←63;
38400	OUTSTR(CRLF&"The following counters exist"&CRLF);
38500	  WHILE L<TBLSIZ%5 DO
38600	   BEGIN
38700		IF J≠0 THEN BEGIN   L←0;
38800		 OUTSTR(CRLF&"Name"&TB&"Input"&TB&"Level"&TB&"Hysteresis"&CRLF);
38900		 FOR I←0 STEP 5 UNTIL TBLSIZ-1 DO
39000		 IF TABLET[I+1]≠0 THEN BEGIN
39100		   OUTSTR(CVXSTR(TABLET[I+1])&TB&CVXSTR(TBLIS[L])&TB&
39200			          CVS(LDB(POINT(3,TABLET[I+2],3)))&TB&
39300				  CVS(LDB(POINT(2,TABLET[I+2],5)))&CRLF);
39400		   L←L+1;              END;
39500		 OUTSTR(CRLF); IF L=0 THEN OUTSTR(TB&TB&"NONE"&CRLF);
39600			    END;
39700	
39800	CLRBUF;
39900	      	OUTSTR(CRLF&"Now type in the name of counter to be modified or added"&CRLF);
40000	     IF (READ1←STRIN(" A CR only terminates the session.Name= "))="" THEN DONE;
40100	     FOR I←0 STEP 5 UNTIL TBLSIZ DO BEGIN
40200	      IF TABLET[I+1]=0 THEN TABLET[I+1]←CVSIX(READ1);
40300		IF TABLET[I+1]=CVSIX(READ1) THEN DONE;
40400					    END;
40500	        IF I≥TBLSIZ-5 THEN BEGIN OUTSTR("COUNTER SPACE EXHAUSTED ***"&CRLF); DONE END;
40600	
40700	    J←LMAX;
40800	    WHILE J≥0 DO BEGIN
40900		READ2←STRIN("    Type name of table for input = ");
41000		FOR J←0 STEP 1 UNTIL LMAX DO IF CVSIX(READ2)=LIST[J] THEN DONE;
41100		  IF J>LMAX THEN OUTSTR("Name not found"&CRLF)  ELSE DONE;
41200			 END;
41300	 
41400	
41500	
41600	   J1←J; K←0; READ3←"";
41700	   IF J≥INTOT THEN IF LIST[J+LISSIZ%10]≥CVSIX("Q") THEN 
41800	    BEGIN  IF K>1 THEN BEGIN J1←J1+1; K←K-2 END;
41900	    K←CVD(STRIN("Which PH (0,1,2,3,4 or 5 for max) = "))+6*K; READ3←"Q"; END;
42000	    IF K>11 THEN K←11;  IF K<0 THEN K←0;
42100	    TABLET[I+4]←LBYTE2[K]+J1*74;	⊂ Store byte pointer to INPUT;
42200	    SETFORMAT(1,0);TBLIS[I%5]←CVSIX(READ3&CVS(K)&READ2); 
42300	    Q←CVD(STRIN("Specify counter trigger level (1-7) = "));
42400	    IF Q≤0 THEN Q←1;
42500	    K←CVD(STRIN("Specify hysteresis time (0-3) = "));
42600	    IF K<0 THEN K←0 ; IF K≥3 THEN K←3;
42700	   TABLET[I+2]←Q LSH 32 + K LSH 30;
42800	  IF STRIN("Want listing (Y or CR) = ")="Y" THEN J←36 ELSE J←0;
42900	END ;   ⊂ ENDS WHILE L≤ LOOP;
43000	
43100	
43200	   O1:  TABOUT;
43300	OUTSTR("Tables in machine usable form filed as TABLES.DAT"&CRLF&LF);
43400	CLOSE(CHAN2); OPEN(CHAN2,"DSK",'10,0,10,0,0,0);
43500	ENTER(CHAN2,"SIGLST.DAT",0);
43600	ARRYOUT(CHAN2,LIST[0],LISSIZ);
43700	WORDOUT(CHAN2,INTOT);
43800	ARRYOUT(CHAN2,TBLIS[0],TBLSIZ%5);
43900	CLOSE(CHAN2);
44000	OUTSTR("List array in machine readable form is in SIGLST.DAT"&CRLF);
44100	
44200	OPEN(CHAN3,"DSK",0,0,10,0,0,EOF);
44300	ENTER(CHAN3,"TABLES.DOC",0);
44400	OUT(CHAN3,TB&"SIGNATURE TABLE SET-UP AS OF "&DATIME(NULL)&CRLF&LF);
44500	OUT(CHAN3,"The following input tables exist"&CRLF);
44600	 I←0;
44700	  FOR P←0 STEP 1 UNTIL INSIZ DO
44800	  BEGIN
44900	   IF INNAM[P]≠0 THEN OUT(CHAN3,CVXSTR(INNAM[P])&TB) ELSE DONE;
45000	   I←I+1; IF I≥8 THEN BEGIN I←0; OUT(CHAN3,CRLF); END;
45100	  END;
45200	OUT(CHAN3,CRLF&LF);
45300	OUT(CHAN3,"Available SIGNIFICANT FEATURES are"&CRLF);
45400	J←0; FOR I←0 STEP 1 UNTIL 35 DO BEGIN
45500	 IF FLIST[I]=0 THEN DONE;
45600	 OUT(CHAN3,CVXSTR(FLIST[I])&TB); J←J+1;
45700	 IF J≥8 THEN BEGIN OUT(CHAN3,CRLF); J←0; END;
45800	END; OUT(CHAN3,CRLF);
45900	OUT(CHAN3,CRLF);
46000	OUT(CHAN3,"PH list and H list table contains"&CRLF);
46100	OUT(CHAN3,CRLF&"PH"&TB&"Significant features"&CRLF);
46200	FOR I←0 STEP 1 UNTIL 63 DO BEGIN
46300	 IF PHLIST[I]=0 THEN DONE;
46400	 OUT(CHAN3,CVXSTR(PHLIST[I])&TB);
46500	HPOINT←POINT(1,HLIST[I],-1);
46600	 FOR J←0 STEP 1 UNTIL 35 DO
46700	   IF (K←ILDB(HPOINT))=1 THEN OUT(CHAN3,CVXSTR(FLIST[J])&" ");
46800	 OUT(CHAN3,CRLF);
46900	END;
47000	OUT(CHAN3,CRLF); IF I=0 THEN OUT(CHAN3,TB&TB&"NONE"&CRLF);
     

00010	OUT(CHAN3,CRLF&"The following input tables exist");
00015	OUT(CHAN3,CRLF&CRLF&"Name"&TB&"Input"&TB); SETFORMAT(1,0);
00020	    FOR I←0 STEP 1 UNTIL 5 DO OUT(CHAN3,"Feat"&CVS(I)&TB);
00030	    FOR L←0 STEP 1 UNTIL INTOT-1 DO BEGIN
00040	    OUT(CHAN3,CRLF&CVXSTR(LIST[L])&TB&CVXSTR(INNAM[(TABLES[L*74+4] LAND '777)]));
00050	    I←POINT(1,TABLES[L*74+5],-1);
00060	    FOR J←0 STEP 1 UNTIL 35 DO IF (ILDB(I))=1 THEN
00070		OUT(CHAN3,TB&CVXSTR(FLIST[J])); END;
     

47100	 OUT(CHAN3,CRLF&"The following tables exist"&CRLF);
47200	OUT(CHAN3,CRLF&"Name"&TB&"TYPE"&TB&"Learn"&TB&"Gate1"&TB&"gate2"&TB&"Gate3"&TB&"Gate4"&TB&"IN1"&TB&"IN2"&TB&"IN3"&CRLF);
47300	FOR L←INTOT STEP 1 UNTIL LISSIZ%10-2 DO 
47400	  IF LIST[L]≠0 THEN IF LIST[L]≠1 THEN BEGIN "DECODE" STRING LEARN;INTEGER K1,K2,K3,K4;
47500	    IF LIST[L+LISSIZ%10]≥CVSIX("Q0") THEN BEGIN
47600	       K←LIST[L+LISSIZ%5]; K1←K LSH -18; K2←(K LSH 18) LSH -30;
47700	       K3←(K LSH 24) LSH -30; K4←(K LSH 30) LSH -30;
47800	       LEARN←CVXSTR(PHLIST[K1])[1 TO 2]&CVXSTR(PHLIST[K2])[1 TO 2]&
47900	             CVXSTR(PHLIST[K3])[1 TO 2]&CVXSTR(PHLIST[K4])[1 TO 2];
48000						  END 
48100	          ELSE LEARN←CVXSTR(LIST[L+LISSIZ%5]);
48110	
48200	  OUT(CHAN3,CVXSTR(LIST[L])&TB&CVXSTR(LIST[L+LISSIZ%10])&
48300	LEARN);
48310	    I←POINT(1,LIST[L+3*LISSIZ%10],-1); K←1;
48315	    FOR J←0 STEP 1 UNTIL 35 DO IF (ILDB(I))=1 THEN BEGIN K←K+1;
48320		OUT(CHAN3,TB&CVXSTR(FLIST[J])); END; 
48330	FOR I←K STEP 1 UNTIL 4 DO OUT(CHAN3,TB);
48340	OUT(CHAN3,TB&CVXSTR(LIST[L+4*LISSIZ%10])&TB&
48500	CVXSTR(LIST[L+LISSIZ%2])&TB&CVXSTR(LIST[L+6*LISSIZ%10])&CRLF); END "DECODE";
48800	OUT(CHAN3,CRLF); OUT(CHAN3,CRLF&"The following counters exist"&CRLF);
48900	
49000	  SETFORMAT(1,0);
49100	
49200		 OUT(CHAN3,CRLF&"Name"&TB&"Input"&TB&"Level"&TB&"Hysteresis"&CRLF);
49300		L←0;  FOR I←0 STEP 5 UNTIL TBLSIZ-1 DO
49400		 IF TABLET[I+1]≠0 THEN BEGIN
49500		   OUT(CHAN3,CVXSTR(TABLET[I+1])&TB&CVXSTR(TBLIS[L])&TB&
49600			          CVS(LDB(POINT(3,TABLET[I+2],3)))&TB&
49700				  CVS(LDB(POINT(2,TABLET[I+2],5)))&CRLF);
49800		   L←L+1;              END;
49900		 IF L=0 THEN OUT(CHAN3,TB&TB&"NONE");
50000	OUT(CHAN3,CRLF);
50100	CLOSE(CHAN3);
50200	OUTSTR("Description of tables filed as TABLE.DOC"&CRLF&LF);
50300	IF STRIN("Do you want to review all changes (YorCR) = ")="Y" THEN GO TO START;
51200	
53000	END;	⊂ End of INTERNAL PROCEDURE MAKE;
53100	END "MAKE";